import request from '@/utils/http'
import { BaseResponse } from './common'

// 订单状态枚举
export type OrderStatus =
  | 'pending'
  | 'paid'
  | 'shipped'
  | 'delivered'
  | 'completed'
  | 'cancelled'
  | 'refunded'
  | 'refunding'

// 支付方式枚举
export type PaymentMethod = 'wechat' | 'alipay'

// 商品类型枚举
export type ProductType = 'vip' | 'ticket' | 'physical'

// VIP类型枚举
export type VipType = 'monthly' | 'yearly'

// 折扣类型枚举
export type DiscountType = 'percent' | 'amount'

// VIP折扣信息
export interface VipDiscount {
  type: DiscountType // 折扣类型
  value: number // 折扣值
}

// VIP信息
export interface VipInfo {
  type: VipType
  duration: number // 持续时间（月数）
  expireTime: number // 过期时间
}

// 收货地址
export interface Address {
  province: string
  city: string
  district: string
  detail: string
  name: string
  phone: string
}

// 订单项
export interface OrderItem {
  productId: string
  productName: string
  productImage: string
  productType: ProductType
  originalPrice: number // 原价（分）
  price: number // 实际价格（分）
  quantity: number // 数量
  originalSubtotal: number // 原小计（分）
  subtotal: number // 实际小计（分）
  hasVipDiscount: boolean // 是否有VIP折扣
  vipDiscount?: VipDiscount | null
  ticketType?: string // 门票类型
  specifications?: string // 商品规格
}

// 订单实体
export interface Order {
  _id?: string
  orderNo: string
  openid: string
  phone: string
  items: OrderItem[]
  originalAmount: number // 原始金额（分）
  discountAmount: number // 折扣金额（分）
  totalAmount: number // 实际支付金额（分）
  paymentMethod: PaymentMethod
  paymentTime?: number // 支付时间
  status: OrderStatus
  isVipOrder: boolean
  vipInfo?: VipInfo | null
  address?: Address | null // 实物商品才有收货地址
  remark?: string
  createTime: number // 创建时间（秒级时间戳）
  updateTime: number // 更新时间（秒级时间戳）
  // 扩展字段 - 用于前端显示
  statusText?: string
  paymentMethodText?: string
  totalAmountYuan?: number // 金额（元）
  formattedCreateTime?: string
  formattedPaymentTime?: string
}

// 订单列表查询参数
export interface OrderListParams {
  page?: number
  size?: number
  sort?: string
  order?: 'asc' | 'desc'
  status?: OrderStatus
  paymentMethod?: PaymentMethod
  isVipOrder?: boolean
  productType?: ProductType
  keyword?: string // 搜索关键字（订单号、用户openid、商品名称）
  startTime?: string // 开始时间（YYYY-MM-DD）
  endTime?: string // 结束时间（YYYY-MM-DD）
  minAmount?: number // 最小金额（分）
  maxAmount?: number // 最大金额（分）
  hasVipDiscount?: boolean // 是否有VIP折扣
}

// 订单列表响应
export interface OrderListResponse {
  data: Order[]
  total: number
  code: number
  message: string
}

// 更新订单状态参数
export interface UpdateOrderStatusParams {
  status: OrderStatus
}

// 处理退款参数
export interface RefundOrderParams {
  reason: string
  amount?: number // 退款金额（可选，分）
}

// 通用响应消息
export interface OrderActionResponse {
  message: string
}

// 订单统计信息
export interface OrderStats {
  totalOrders: number // 总订单数
  totalAmount: number // 总金额（分）
  totalDiscountAmount: number // 总折扣金额（分）
  ordersByStatus: Record<string, number> // 按状态统计
  ordersByPayment: Record<string, number> // 按支付方式统计
  ordersByType: Record<string, number> // 按商品类型统计
  vipOrderCount: number // VIP订单数
  vipDiscountAmount: number // VIP折扣总金额
  avgOrderAmount: number // 平均订单金额（分）
}

export class OrderService {
  // 获取订单列表
  static getOrderList(params?: OrderListParams) {
    return request.get<BaseResponse<Order[]>>({
      url: '/api/v1/admin/order/list',
      params
    })
  }

  // 获取订单详情
  static getOrderDetail(id: string) {
    return request.get<BaseResponse<Order>>({
      url: `/api/v1/admin/order/detail/${id}`
    })
  }

  // 更新订单状态
  static updateOrderStatus(id: string, params: UpdateOrderStatusParams) {
    return request.put<BaseResponse<OrderActionResponse>>({
      url: `/api/v1/admin/order/status/${id}/${params.status}`,
      params
    })
  }

  // 处理订单退款
  static refundOrder(id: string, params: RefundOrderParams) {
    return request.post<BaseResponse<OrderActionResponse>>({
      url: `/api/v1/admin/order/refund/${id}`,
      params
    })
  }

  // 获取订单统计信息（如果后端有提供）
  static getOrderStats() {
    return request.get<BaseResponse<OrderStats>>({
      url: '/api/v1/admin/order/stats'
    })
  }
}

// 工具函数

// 获取订单状态文本
export const getOrderStatusText = (status: OrderStatus): string => {
  const texts: Record<OrderStatus, string> = {
    pending: '待支付',
    paid: '已支付',
    shipped: '已发货',
    delivered: '已收货',
    completed: '已完成',
    cancelled: '已取消',
    refunded: '已退款',
    refunding: '退款中'
  }
  return texts[status] || status
}

// 获取订单状态标签类型
export const getOrderStatusTagType = (status: OrderStatus): string => {
  const types: Record<OrderStatus, string> = {
    pending: 'warning',
    paid: 'primary',
    shipped: 'success',
    delivered: 'success',
    completed: 'success',
    cancelled: 'info',
    refunded: 'danger',
    refunding: 'warning'
  }
  return types[status] || 'info'
}

// 获取支付方式文本
export const getPaymentMethodText = (method: PaymentMethod): string => {
  const texts: Record<PaymentMethod, string> = {
    wechat: '微信支付',
    alipay: '支付宝'
  }
  return texts[method] || method
}

// 获取支付方式标签类型
export const getPaymentMethodTagType = (method: PaymentMethod): string => {
  const types: Record<PaymentMethod, string> = {
    wechat: 'success',
    alipay: 'primary'
  }
  return types[method] || 'info'
}

// 获取商品类型文本
export const getProductTypeText = (type: ProductType): string => {
  const texts: Record<ProductType, string> = {
    vip: 'VIP会员',
    ticket: '入场券',
    physical: '实物商品'
  }
  return texts[type] || type
}

// 获取商品类型标签类型
export const getProductTypeTagType = (type: ProductType): string => {
  const types: Record<ProductType, string> = {
    vip: 'warning',
    ticket: 'success',
    physical: 'primary'
  }
  return types[type] || 'info'
}

// 分转元
export const centToYuan = (cent: number): number => {
  return cent / 100
}

// 元转分
export const yuanToCent = (yuan: number): number => {
  return Math.round(yuan * 100)
}

// 格式化金额显示
export const formatAmount = (cent: number): string => {
  return `¥${(cent / 100).toFixed(2)}`
}

// 判断订单是否可以发货
export const canShipOrder = (status: OrderStatus): boolean => {
  return status === 'paid'
}

// 判断订单是否可以完成
export const canCompleteOrder = (status: OrderStatus): boolean => {
  return status === 'delivered'
}

// 判断订单是否可以退款
export const canRefundOrder = (status: OrderStatus): boolean => {
  return ['paid', 'shipped', 'delivered'].includes(status)
}

// 判断是否为实物商品订单
export const isPhysicalOrder = (items: OrderItem[]): boolean => {
  return items.some((item) => item.productType === 'physical')
}

// 计算订单总的VIP折扣金额
export const calculateVipDiscountAmount = (items: OrderItem[]): number => {
  return items.reduce((total, item) => {
    if (item.hasVipDiscount && item.vipDiscount) {
      const discount = item.originalSubtotal - item.subtotal
      return total + discount
    }
    return total
  }, 0)
}
